# 命名空间和作用域
# 命名空间
# 命名空间(Namespace)是从名称到对象的映射，大部分的命名空间都是通过 Python 字典来实现的。
#
# 命名空间提供了在项目中避免名字冲突的一种方法。各个命名空间是独立的，没有任何关系的，所以一个命名空间中不能有重名，但不同的命名空间是可以重名而没有任何影响。
# 一般有三种命名空间：
#
# 内置名称（built-in names）， Python 语言内置的名称，比如函数名 abs、char 和异常名称 BaseException、Exception 等等。
# 全局名称（global names），模块中定义的名称，记录了模块的变量，包括函数、类、其它导入的模块、模块级的变量和常量。
# 局部名称（local names），函数中定义的名称，记录了函数的变量，包括函数的参数和局部定义的变量。（类中定义的也是）

# var1 是全局名称
var1 = 5


def some_func():
    # var2 是局部名称
    var2 = 6

    def some_inner_func():
        # var3 是内嵌的局部名称
        var3 = 7


# 作用域
# global 和 nonlocal关键字
# 当内部作用域想修改外部作用域的变量时，就要用到 global 和 nonlocal 关键字了。
global_num = 1


def outer():
    global global_num   # 需要使用 global 关键字声明
    nonlocal_num = 2
    print(f"start global_num param -> ", global_num)
    print(f"start nonlocal param -> ", nonlocal_num)
    global_num += 1
    print(f"end global_num param -> ", global_num)

    def inner():
        nonlocal nonlocal_num   # 需要使用 nonlocal 关键字声明
        nonlocal_num += 1
        print(f"end nonlocal param -> ", nonlocal_num)

    inner()


outer()






